xenconsole: support for multiple consoles per domain
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 16 Jun 2009 10:24:58 +0000 (11:24 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 16 Jun 2009 10:24:58 +0000 (11:24 +0100)
This patch adds a new command line argument to xenconsole to specify
to which console to connect to in case a domain has more than one.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
tools/console/client/main.c
tools/python/xen/xm/console.py
tools/python/xen/xm/main.py

index 39556da5a048fb72a8caa2b4eabd3a5cbf13cad3..b66baf8ae6655e98e3b25b68b7dd28a054b04935 100644 (file)
@@ -71,6 +71,7 @@ static void usage(const char *program) {
               "Attaches to a virtual domain console\n"
               "\n"
               "  -h, --help       display this help and exit\n"
+              "  -n, --num N      use console number N\n"
               , program);
 }
 
@@ -255,15 +256,17 @@ int main(int argc, char **argv)
 {
        struct termios attr;
        int domid;
-       char *sopt = "h";
+       char *sopt = "hn:";
        int ch;
+       unsigned int num = 0;
        int opt_ind=0;
        struct option lopt[] = {
+               { "num",     1, 0, 'n' },
                { "help",    0, 0, 'h' },
                { 0 },
 
        };
-       char *path;
+       char *dom_path = NULL, *path = NULL;
        int spty, xsfd;
        struct xs_handle *xs;
        char *end;
@@ -274,16 +277,17 @@ int main(int argc, char **argv)
                        usage(argv[0]);
                        exit(0);
                        break;
+               case 'n':
+                       num = atoi(optarg);
+                       break;
+               default:
+                       fprintf(stderr, "Invalid argument\n");
+                       fprintf(stderr, "Try `%s --help' for more information.\n", 
+                                       argv[0]);
+                       exit(EINVAL);
                }
        }
        
-       if ((argc - optind) != 1) {
-               fprintf(stderr, "Invalid number of arguments\n");
-               fprintf(stderr, "Try `%s --help' for more information.\n", 
-                       argv[0]);
-               exit(EINVAL);
-       }
-       
        domid = strtol(argv[optind], &end, 10);
        if (end && *end) {
                fprintf(stderr, "Invalid DOMID `%s'\n", argv[optind]);
@@ -299,13 +303,13 @@ int main(int argc, char **argv)
 
        signal(SIGTERM, sighandler);
 
-       path = xs_get_domain_path(xs, domid);
-       if (path == NULL)
+       dom_path = xs_get_domain_path(xs, domid);
+       if (dom_path == NULL)
                err(errno, "xs_get_domain_path()");
-       path = realloc(path, strlen(path) + strlen("/console/tty") + 1);
+       path = malloc(strlen(dom_path) + strlen("/serial/0/tty") + 3);
        if (path == NULL)
-               err(ENOMEM, "realloc");
-       strcat(path, "/console/tty");
+               err(ENOMEM, "malloc");
+       snprintf(path, strlen(dom_path) + strlen("/serial/0/tty") + 2, "%s/serial/%d/tty", dom_path, num);
 
        /* FIXME consoled currently does not assume domain-0 doesn't have a
           console which is good when we break domain-0 up.  To keep us
@@ -336,5 +340,6 @@ int main(int argc, char **argv)
        restore_term(STDIN_FILENO, &attr);
 
        free(path);
+       free(dom_path);
        return 0;
  }
index 0b83f1139dec50ef664fdadc5aa8365d1b1d808c..f31d561836888cc5d98716487b86bb56908dff63 100644 (file)
@@ -24,8 +24,8 @@ from xen.util import utils
 
 XENCONSOLE = "xenconsole"
 
-def execConsole(domid):
-    xen.util.auxbin.execute(XENCONSOLE, [str(domid)])
+def execConsole(domid, num = 0):
+    xen.util.auxbin.execute(XENCONSOLE, [str(domid), "--num", str(num)])
 
 
 class OurXenstoreConnection:
index bea552452e2ed0a1b3ee9de446b53bc0441fc0ca..d14eabcc913bf150c3f434350d290664e7e6f243 100644 (file)
@@ -1779,12 +1779,13 @@ def xm_info(args):
                 print "%-23s:" % x[0], x[1]
 
 def xm_console(args):
-    arg_check(args, "console", 1, 2)
+    arg_check(args, "console", 1, 3)
 
+    num = 0
     quiet = False;
 
     try:
-        (options, params) = getopt.gnu_getopt(args, 'q', ['quiet'])
+        (options, params) = getopt.gnu_getopt(args, 'qn:', ['quiet', 'num'])
     except getopt.GetoptError, opterr:
         err(opterr)
         usage('console')
@@ -1792,6 +1793,8 @@ def xm_console(args):
     for (k, v) in options:
         if k in ['-q', '--quiet']:
             quiet = True
+       elif k in ['-n', '--num']:
+           num = int(v[0])
         else:
             assert False
 
@@ -1819,7 +1822,7 @@ def xm_console(args):
         else:
             raise xmlrpclib.Fault(0, "Domain '%s' is not started" % dom)
 
-    console.execConsole(domid)
+    console.execConsole(domid, num)
 
 
 def domain_name_to_domid(domain_name):